perm filename PASS5[901,BGB] blob
sn#129621 filedate 1974-11-12 generic text, type T, neo UTF8
00100 TITLE PASS5
00200 EXTERNAL INPUT5,INPUT6,FFLAG,OUTPDL,END6
00300 INTERNAL PASS5
00400 ;ACCUMULATORS
00500 XL←←0
00600 YL←←1
00700 XH←←2
00800 YH←←3
00900 X1←←B←←4
01000 Y1←←5
01100 X2←←CC←←6
01200 Y2←←CCC←←Q←←7
01300 XM←←AAA←←10
01400 YM←←BBB←←11
01500 XN←←AA←←12
01600 YN←←BB←←13
01700 X←←14
01800 Y←←15
01900 P←←16
02000 A←←17
02100 KPLANE←20000
00100 PASS5: 0
00200 MOVEI P,INPUT5-1
00300 MOVE A,OUTPDL
00400 SUBI A,INPUT5-1
00500 MOVNS A
00600 HRL P,A
00700 MOVEM P,TEM1#
00800 MOVEI P,INPUT6
00900 LOOP: HRRZ A,P
00905 SUBI A,END6
00910 SKIPL A
00915 JRST EXIT5 ;OUTPUT BUFFER OVERFLOW.
00920 EXCH P,TEM1
01000 AOBJP P,EXIT5
01100 MOVE A,(P)
01200 AOBJP P,EXIT5
01300 HLRE XL,(P)
01400 HRRE YL,(P)
01500 MOVE XH,XL
01600 MOVE YH,YL
01700 HLRZ X,A
01800 ANDI X,177777
01900 ADD XH,X
02000 ADD YH,X
02100
02200 EXCH P,TEM1
02300
02310 SKIPE FFLAG ;TEST FRAME FLAG
02320 JSR FRAME
02330
02400 TLNE A,600000
02500 JRST INTERS
02600
02700 HRL A,4(A) ;PENETRATOR
02800 DEFINE UNPACK (N,M) {
02900 MOVE Y1,N-1(A)
03000 MOVE Y2,M-1(A)
03100 HLRE X1,Y1
03200 HLRE X2,Y2
03300 HRRES Y1
03400 HRRES Y2
03500 JSR CLIP
03600 ⎇
03700 TLNE A,4
03800 JRST [UNPACK 2,3
03900 JRST .+1]
04000 TLNE A,2
04100 JRST [UNPACK 1,3
04200 JRST .+1]
04300 TLNE A,1
04400 JRST [UNPACK 1,2
04500 JRST .+1]
04600 JRST LOOP
04700
04800
04900 ;INTERSECTING PLANES AND SURROUNDERS AND CORNERS
05000 INTERS: EXCH P,TEM1
05100 AOBJP P,EXIT5
05200 MOVE B,(P)
05300 EXCH P,TEM1
05400 HLRE AA,11(A)
05500 HRRE BB,11(A)
05600 HLRE CC,12(A)
05700 HLRE AAA,11(B)
05800 HRRE BBB,11(B)
05900 HLRE CCC,12(B)
06000
06100 MOVM X,CC
06200 MOVM Y,CCC
06300 CAML X,Y
06400 JRST [EXCH CC,CCC
06410 EXCH AA,AAA
06420 EXCH BB,BBB
06430 JRST .+1
06440 ]
06500 SKIPN CCC
06600 JRST LOOP
06610 ASH CC,22
06700 IDIVM CC,CCC
06710 HRLZI CC,1
06720 SUB CC,CCC
06730 IMULI CC,KPLANE
06740 ASH CC,-22
06800 IMUL AAA,Q
06900 IMUL BBB,Q
06910 ASH AAA,-22
06920 ASH BBB,-22
07000 SUB AA,AAA
07100 SUB BB,BBB
07200 MOVM X,AA
07300 MOVM Y,BB
07400 CAMG X,Y
07500 JRST INTERP
07600
07700 MOVEI X1,CC
07800 MOVE Y1,YL
07900 IMUL Y1,BB
08000 SUB X1,Y1
08100 IDIV X1,AA
08200 MOVE Y1,YL
08300
08500 MOVE Y2,YH
08600 IMUL Y2,BB
08700 SUB X2,Y2
08800 IDIV X2,AA
08900 MOVE Y2,YH
09000 JSR CLIP
09100 JRST LOOP
00100 INTERP: MOVEI Y1,KPLANE
00200 MOVE X1,XL
00300 IMUL X1,AA
00400 SUB Y1,X1
00500 IDIV Y1,BB
00600 MOVE X1,XL
00700 MOVEI Y2,KPLANE
00800 MOVE X2,XH
00900 IMUL X2,AA
01000 SUB Y2,X2
01100 IDIV Y2,BB
01200 MOVE X2,XH
01300 JSR CLIP
01400 JRST LOOP
00100 DEFINE FRAM $ (A,B,C,D) {
00110 MOVE X1,X$A
00120 MOVE Y1,Y$B
00130 SUB X1,X$C
00140 SUB Y1,Y$D
00150 HRL Y1,X1
00160 HRR Y,Y$D
00170 HRL Y,X$C
00180 PUSH P,Y
00190 PUSH P,Y1
00200 ⎇
00210 FRAME: 0
00220 FRAM L,H,L,L
00230 FRAM H,H,L,H
00240 FRAM H,L,H,H
00250 FRAM L,L,H,L
00260 JRST @FRAME
00300
00400 EXIT5: EXCH P,TEM1
00500 MOVNS P ;LEFT HALF WORD APPEARS COMPLEMENTED & DECREMENTED
00600 HLLM P,INPUT6
00700 MOVEI P,INPUT6
00800 HRRM P,INPUT6
00900 JRST @PASS5
00100 ;PASS5 LINE SEGMENT CLIPPING ROUTINE
00200 CLIP: 0
00300 HRREI X,-14
00400 MOVEM X,LIMIT2#
00500 CLIP3: AOSL LIMIT2
00600 JRST @CLIP
00700 ;EXIT IF BOTH END-POINTS ARE OUTSIDE
00800 CAMGE X1,XH ;BOTH ABOVE XH
00900 JRST .+3
01000 CAML X2,XH
01100 JRST @CLIP
01200 CAMGE Y1,YH ;BOTH ABOVE YH
01300 JRST .+3
01400 CAML Y2,YH
01500 JRST @CLIP
01600 CAMLE X1,XL ;BOTH BELOW XL
01700 JRST .+3
01800 CAMG X2,XL
01900 JRST @CLIP
02000 CAMLE Y1,YL ;BOTH BELOW YL
02100 JRST .+3
02200 CAMG Y2,YL
02300 JRST @CLIP
02400
02500 CAMLE X1,XH ;IS (X1,Y1) WITHIN
02600 JRST NO1
02700 CAMLE XL,X1
02800 JRST NO1
02900 CAMLE Y1,YH
03000 JRST NO1
03100 CAMLE YL,Y1
03200 JRST NO1
03300 CAMLE X2,XH ;IS (X2,Y2) WITHIN
03400 JRST NO2
03500 CAMLE XL,X2
03600 JRST NO2
03700 CAMLE Y2,YH
03800 JRST NO2
03900 CAMLE YL,Y2
04000 JRST NO2
04100 CLIP2: SUB X2,X1 ;BOTH POINTS WITHIN; DISPLAY & EXIT.
04200 SUB Y2,Y1
04300 HRL Y1,X1
04400 HRL Y2,X2
04500 PUSH P,Y1
04600 PUSH P,Y2
04700 JRST @CLIP
04800
04900 NO2: MOVE XN,X1 ;1 IN, 2 OUT.
05000 MOVE YN,Y1
05100 JSR N2
05200 JRST CLIP2
05300
05400 NO1: CAMLE X2,XH ;IS (X2,Y2) WITHIN
05500 JRST NO3
05600 CAMLE XL,X2
05700 JRST NO3
05800 CAMLE Y2,YH
05900 JRST NO3
06000 CAMLE YL,Y2
06100 JRST NO3
06200 MOVE XM,X2 ;2 IN, 1 OUT.
06300 MOVE YM,Y2
06400 JSR M1
06500 JRST CLIP2
06600
06700 NO3: MOVE XM,X1 ;CALCULATE MIDPOINT
06800 MOVE YM,Y1
06900 ADD XM,X2
07000 ADD YM,Y2
07100 ASH XM,-1
07200 ASH YM,-1
07300 CAMLE XM,XH ;IS (XM,YM) WITHIN
07400 JRST NO4
07500 CAMLE XL,XM
07600 JRST NO4
07700 CAMLE YM,YH
07800 JRST NO4
07900 CAMLE YL,YM
08000 JRST NO4
08100 MOVE XN,XM
08200 MOVE YN,YM
08300 JSR N2
08400 JSR M1
08500 JRST CLIP2
08600
08700 NO4: CAMGE X1,XH ;BOTH ABOVE XH
08800 JRST .+3
08900 CAML XM,XH
09000 JRST NO5
09100 CAMGE Y1,YH ;BOTH ABOVE YH
09200 JRST .+3
09300 CAML YM,YH
09400 JRST NO5
09500 CAMLE X1,XL ;BOTH BELOW XL
09600 JRST .+3
09700 CAMG XM,XL
09800 JRST NO5
09900 CAMLE Y1,YL ;BOTH BELOW YL
10000 JRST .+3
10100 CAMG YM,YL
10200 JRST NO5
10300 MOVE X2,XM
10400 MOVE Y2,YM
10500 JRST CLIP3
10600 NO5: MOVE X1,XM
10700 MOVE Y1,YM
10800 JRST CLIP3
10900
00100 N2: 0 ;N IS IN, 2 IS OUT.
00200 HRREI X,-13
00300 MOVEM X,LIMIT#
00400 N2C: AOSL LIMIT
00500 JRST @N2
00600 MOVE X,XN ;MIDPOINT
00700 MOVE Y,YN
00800 ADD X,X2
00900 ADD Y,Y2
01000 ASH X,-1
01100 ASH Y,-1
01200 CAME X,XN ;EXIT ON MATCH
01300 JRST N2B
01400 CAME Y,YN
01500 JRST N2B
01600 N2A: MOVE X2,XN ;EXIT
01700 MOVE Y2,YN
01800 JRST @N2
01900 N2B: CAME X,X2
02000 JRST .+3
02100 CAMN Y,Y2
02200 JRST N2A
02300 CAMLE X,XH ;IS (X,Y) WITHIN
02400 JRST NON2
02500 CAMLE XL,X
02600 JRST NON2
02700 CAMLE Y,YH
02800 JRST NON2
02900 CAMLE YL,Y
03000 JRST NON2
03100 MOVE XN,X ;MIDPOINT WITHIN
03200 MOVE YN,Y
03300 JRST N2C
03400 NON2: MOVE X2,X ;MIDPOINT OUTSIDE
03500 MOVE Y2,Y
03600 JRST N2C
00100 M1: 0 ;M IS IN, 1 IS OUT.
00200 HRREI X,-13
00300 MOVEM X,LIMIT#
00400 M1C: AOSL LIMIT
00500 JRST @M1
00600 MOVE X,XM ;MIDPOINT
00700 MOVE Y,YM
00800 ADD X,X1
00900 ADD Y,Y1
01000 ASH X,-1
01100 ASH Y,-1
01200 CAME X,XM ;EXIT ON MATCH
01300 JRST M1B
01400 CAME Y,YM
01500 JRST M1B
01600 M1A: MOVE X1,XM ;EXIT
01700 MOVE Y1,YM
01800 JRST @M1
01900 M1B: CAME X,X1
02000 JRST .+3
02100 CAMN Y,Y1
02200 JRST M1A
02300 CAMLE X,XH ;IS (X,Y) WITHIN
02400 JRST NOM1
02500 CAMLE XL,X
02600 JRST NOM1
02700 CAMLE Y,YH
02800 JRST NOM1
02900 CAMLE YL,Y
03000 JRST NOM1
03100 MOVE XM,X ;MIDPOINT WITHIN
03200 MOVE YM,Y
03300 JRST M1C
03400 NOM1: MOVE X1,X ;MIDPOINT OUTSIDE
03500 MOVE Y1,Y
03600 JRST M1C
03700
03800 END